package precRev;

import java.util.ArrayList;
import java.util.Iterator;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYIntervalSeries;
import org.jfree.data.xy.XYIntervalSeriesCollection;
import org.jfree.ui.ApplicationFrame;

public class gerarGraficoSistema extends ApplicationFrame {

	private static final long serialVersionUID = 1L;

    public gerarGraficoSistema(ArrayList<Consulta> consultas) {

        super("Curva Precis�o x Revoca��o do Sistema");
        
        final XYIntervalSeries iseries = new XYIntervalSeries("Curva P R");
              
        //int[] resposta = {203,202,310,415,620,7,183,195,110,53,80,81,82,95,152,167,173,178,181,420};
        //int[] docs = {152,195,202};
        
        
        //Varrer o ArrayList, pegar consulta por consulta e calcular seus valores de precisao, interpolando-os
        //Depois disso, montar o grafico do sistema
        
        Iterator<Consulta> i = consultas.iterator();
        
        while(i.hasNext()) { //Iteracao no ArrayList
        	
        	Consulta cTemp = i.next();
        	
        	String[] resposta = cTemp.getRespostas();
            String[] docs = cTemp.getRelevantes();
            
            int relevantesEncontrados = 0, calcTemp;
            
            //calculos locais no la�o
            double precisao, revocacao;
            
            /*controle dos valores de precisao em cada intervalo
             * o array representa (cada posicao):
             * 0-10
             * 10-20
             * 20-30
             * ...
             */
            double[] intervalos = {0,0,0,0,0,0,0,0,0,0};
            
            for(int x=0;x<resposta.length;x++) {
            	
            	for(int y=0;y<docs.length;y++) {
            		
            		if(resposta[x].equals(docs[y])) { //intersecao encontrada
            			relevantesEncontrados++;

                    	precisao = 100*((double)relevantesEncontrados/(double)(x+1));
                    	revocacao = 100*((double)relevantesEncontrados/(double)docs.length);
                    	
                    	calcTemp = (int)revocacao/10;
                    	
                    	if((revocacao%10) == 0 && calcTemp != 10) { //valor de revoca��o � padr�o
                    		if(intervalos[calcTemp] < precisao) intervalos[calcTemp] = precisao;  
                    	}
                    	
                    	//atualizando array de intervalos
                    	if(intervalos[calcTemp-1] < precisao) intervalos[calcTemp-1] = precisao;      	        	        
                    }
            		
            	}
            	
            }

            //PRECISOES E REVOCACOES CALCULADOS.. INTERPOLACAO AGORA.
            
            for(int g=0;g<intervalos.length;g++) {

            	if(intervalos[g] > 0) { //ha um valor de precisao calculado. Vou aplicar pra todos os intervalos anteriores que nao possuem valor calculado       	
            		for(int f=0;f<g;f++) {
            			if(intervalos[f] == 0) intervalos[f] = intervalos[g]; //aplicando pra todos os anteriores
            		}
            	}

            }

            cTemp.setIntervalos(intervalos); //Salvo o array de intervalos para cada objeto consulta        	
        	
        }
        
        //Pontos calculados para todos os elementos do ArrayList (consultas ativas no sistema)
        
        //Logica para calcular os pontos do grafico do sistema        
        //Varro novamente o ArrayList 
        
        double[] somatorio = {0,0,0,0,0,0,0,0,0,0};
        
        i = consultas.iterator();

        while(i.hasNext()) {
        	
        	Consulta cTemp = i.next();

        	double[] intervalosConsulta = cTemp.getIntervalos();
        	for(int g=0;g<intervalosConsulta.length;g++) {
        		somatorio[g] += cTemp.getIntervalos()[g]; 
        	}

        }        
        
        //ponto zero
        iseries.add(0, 0, 10, somatorio[0]/consultas.size(), 0, 10);
        
        for(int g=0;g<somatorio.length;g++) {
        	somatorio[g] /= consultas.size(); //Divido cada valor pelo numero de consultas
        	iseries.add((g+1)*10, g*10, (g*10)+10, somatorio[g], g*10, (g*10)+10);
        }
                
        //PLOTAR GRAFICO
        
        final XYIntervalSeriesCollection dataX = new XYIntervalSeriesCollection();
        dataX.addSeries(iseries);
      
        final JFreeChart grafico = ChartFactory.createXYLineChart(
            "Precis�o x Revoca��o do Sistema",
            "Revoca��o (%)", 
            "Precis�o (%)", 
            dataX,
            PlotOrientation.VERTICAL,
            true,
            true,
            false
        );

        XYPlot plot = grafico.getXYPlot();
        XYLineAndShapeRenderer r = new XYLineAndShapeRenderer();
        plot.setRenderer(r);  
        
        final ChartPanel painel = new ChartPanel(grafico);
        painel.setPreferredSize(new java.awt.Dimension(600, 370));
                
        setContentPane(painel);

    }   
	
}
